/*!
 * \file WtHelper.cpp
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 回测助手工具类实现文件
 * 
 * \details 本文件实现了WtHelper类的各种静态方法，用于在WonderTrader回测框架中提供路径管理和目录操作功能。
 *          主要实现功能包括：
 *          - 获取当前工作目录的跨平台实现
 *          - 输出目录的设置和获取
 *          - 路径标准化处理
 *          - 目录自动创建功能
 */
#include "WtHelper.h"

#include "../Share/StrUtil.hpp"
#include <boost/filesystem.hpp>

#ifdef _MSC_VER
#include <direct.h>
#else	//UNIX
#include <unistd.h>
#endif

/*!
 * \brief 实例目录静态成员变量定义
 * 
 * \details 存储回测框架的实例目录路径，用于配置文件和资源文件的定位。
 */
std::string WtHelper::_inst_dir;

/*!
 * \brief 输出目录静态成员变量定义
 * 
 * \details 存储回测框架的输出目录路径，默认值为"./outputs_bt/"。
 *          该目录用于存放回测结果、日志文件、报告等输出文件。
 */
std::string WtHelper::_out_dir = "./outputs_bt/";

/*!
 * \brief 获取当前工作目录
 * 
 * \return 当前工作目录的标准化路径字符串
 * 
 * \details 跨平台获取当前工作目录的实现。使用静态变量缓存结果以提高性能。
 *          在Windows平台使用_getcwd函数，在Unix/Linux平台使用getcwd函数。
 *          获取到的路径会经过标准化处理，确保路径分隔符的一致性。
 *          
 *          实现特点：
 *          - 首次调用时获取并缓存结果
 *          - 后续调用直接返回缓存值
 *          - 跨平台兼容性处理
 *          - 路径标准化处理
 */
std::string WtHelper::getCWD()
{
	static std::string _cwd;
	if(_cwd.empty())
	{
		char   buffer[255];
#ifdef _MSC_VER
		// Windows平台：使用_getcwd获取当前工作目录
		_getcwd(buffer, 255);
#else	//UNIX
		// Unix/Linux平台：使用getcwd获取当前工作目录
		if (getcwd(buffer, 255) == NULL) {
			buffer[0] = '\0';  // 失败时清空缓冲区
		}
#endif
		_cwd = buffer;
		// 标准化路径格式，统一路径分隔符
		_cwd = StrUtil::standardisePath(_cwd);
	}	
	return _cwd;
}

/*!
 * \brief 设置输出目录路径
 * 
 * \param out_dir 输出目录路径字符串
 * 
 * \details 设置回测框架的输出目录路径。输入的路径会经过标准化处理，
 *          确保路径格式的一致性和正确性。设置后，所有回测输出文件
 *          （如交易日志、性能报告、策略输出等）都会保存到该目录。
 *          
 *          功能特点：
 *          - 自动进行路径标准化
 *          - 支持相对路径和绝对路径
 *          - 线程安全的静态变量操作
 */
void WtHelper::setOutputDir(const char* out_dir)
{
	_out_dir = StrUtil::standardisePath(std::string(out_dir));
}

/*!
 * \brief 获取输出目录路径
 * 
 * \return 输出目录的路径字符串指针
 * 
 * \details 获取回测框架的输出目录路径。如果指定的目录不存在，
 *          函数会自动创建该目录及其父目录。这确保了输出文件
 *          可以正常保存而不会因为目录不存在而失败。
 *          
 *          功能特点：
 *          - 自动检查目录是否存在
 *          - 不存在时自动创建目录
 *          - 支持创建多级目录结构
 *          - 使用boost::filesystem进行目录操作
 *          
 *          注意事项：
 *          - 如果目录创建失败，boost可能会抛出异常
 *          - 返回的指针指向内部静态字符串，生命周期持续到程序结束
 */
const char* WtHelper::getOutputDir()
{
	// 检查输出目录是否存在，不存在则创建
	if (!boost::filesystem::exists(_out_dir.c_str()))
        boost::filesystem::create_directories(_out_dir.c_str());
	return _out_dir.c_str();
}